#ifndef BPLUSTREE_H
#define BPLUSTREE_H

#include "../persistencia/file.h"
#include "nodo.cpp"

template<class Key, class Record>
class ArbolBMas {

public:
    template<class, class> friend class IteradorBMas;

    ArbolBMas(const std::string& nombreArchivo, u_int32_t tamanioNode);

    virtual ~ArbolBMas();

    bool isOpen();

    Nullable<Record> buscar(Key clave);

    bool insertar(Record registro);

    bool modificar(Record registro);

    bool borrar(Key registro);

    std::string toString();

protected:
    File archivo;
    bool open;
    u_int32_t tamanioNodo;
    Node<Key, Record> raiz;

    Node<Key, Record> leerNodo(u_int32_t pos);
    void escribirNodo(Node<Key, Record>& nodo);
    void agregarNodo(Node<Key, Record>& nodo);

    bool insertarRecursivo(Node<Key, Record>& nodo, Node<Key, Record>& padre,
                           Nullable<TreeRecord<Key, Record> >& registro);

    void manejarOverflow(Node<Key, Record>& nodo, Node<Key, Record>& padre,
                         Nullable<TreeRecord<Key, Record> >& registro);

    bool distribuir(Node<Key, Record>& nodo, Node<Key, Record>& padre,
                    Nullable<TreeRecord<Key, Record> >& registro);

    void dividir(Node<Key, Record>& nodo, Nullable<TreeRecord<Key, Record> >& registro);

    void toString(u_int32_t pos, std::stringstream& sout, u_int16_t nivel);
};

#endif // BPLUSTREE_H
